package com.demo.core.service.base;

import java.io.InputStream;
import java.sql.Blob;
import java.util.List;

import com.demo.core.model.File;
/**
 * 文件服务
 * 
 * @author ryuu.kk
 *
 */
public interface FileService {

	/**
	 * 创建文件
	 * @param file 文件外键ID
	 * @return 外键外键ID
	 */
	Long createFile(File file);
	
	/**
	 * 删除文件
	 * @param fileId 文件外键ID
	 */
	void deleteFild(Long fileId);
	
	/**
	 * 删除文件
	 * @param uuid 文件标示
	 */
	void deleteFild(String uuid);
	
	/**
	 * 查找文件（默认不包含文件内容）
	 * @param fileId 文件外键ID
	 * @return 文件对象模型
	 */
	File findFile(Long fileId);
	
	/**
	 * 查找文件
	 * @param fileId 文件外键ID
	 * @param isContent 是否包含内容
	 * @return 文件对象模型
	 */
	File findFile(Long fileId, boolean isContent);
	
	/**
	 * 查询文件
	 * @param uuid UUID
	 * @return File
	 */
	File findFile(String uuid);
	
	/**
	 * 查询文件
	 * @param uuid UUID
	 * @param isContent 是否取得文件内容
	 * @return File
	 */
	File findFile(String uuid, Boolean isContent);
	
	/**
	 * 根据文件夹外键ID，取得文件夹列表（默认不取得文件内容）
	 * @param folderId 文件夹外键ID
	 * @return 文件模型列表
	 */
	List<File> findFileList(Long folderId);
	
	/**
	 * 根据文件夹外键ID，取得文件夹列表
	 * @param folderId 文件夹外键ID
	 * @param isContent 是否取得内容
	 * @return 文件模型列表
	 */
	List<File> findFileList(Long folderId, boolean isContent);
	
	/**
	 * 设置文件是否有效
	 * @param fileId 文件外键ID
	 * @param enabled 是否可用
	 * @param status 文件状态
	 */
	void validFile(Long fileId, boolean enabled, String status);
	
	/**
	 * 取得文件内容
	 * @param fileId 文件ID
	 * @return 文件内容字节
	 */
	byte[] queryBitFile(Long fileId);
	
	/**
	 * 以Blob类型取得文件内容
	 * 大文件的取得方式
	 * @param fileId 文件ID
	 * @return 文件内容(Blob类型)
	 */
	Blob queryBlobFile(Long fileId);
	
	/**
	 * 以文件流形式取得文件内容
	 * 大文件的取得方式
	 * @param fileId 文件ID
	 * @return 文件内容(输入流)
	 */
	InputStream queryFileStream(Long fileId);
	
	/**
	 * 更新文件名&文件状态
	 * @param fileId 文件外键ID
	 * @param name 文件名
	 * @param status 文件状态
	 */
	void changeFile(Long fileId, String name, String status);
	
	/**
	 * 更新文件内容&文件名称
	 * @param fileId 文件外键ID
	 * @param name 文件名
	 * @param content 文件内容
	 */
	void updateFile(Long fileId, String name, byte[] content);
	
	/**
	 * 判断文件是否存在
	 * @param fileId 文件ID
	 * @return 是否存在
	 */
	boolean fileExists(Long fileId);
	
	/**
	 * 判断文件是否存在
	 * @param uuid 文件唯一标示ID
	 * @return boolean
	 */
	boolean fileExists(String uuid);
}
